#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=1e6+5;
int sz,last;
int endpos[N*2];

struct node{
	int len,link;
	map<char,int> nxt;
}st[2*N];

void sam_init(){
	st[0].len=0;
	st[0].link=-1;
	sz++;
	last=0;
}

void ins(char c){
	int cur=sz++;
	endpos[cur]=1;
	st[cur].len=st[last].len+1;
	int p=last;
	while(p!=-1&&!st[p].nxt.count(c)){
		st[p].nxt[c]=cur;
		p=st[p].link;
	}
	if(p==-1){
		st[cur].link=0;
	}else{
		int q=st[p].nxt[c];
		if(st[p].len+1==st[q].len){
			st[cur].link=q;
		}else{
			int clone=sz++;
			st[clone].len=st[p].len+1;
			st[clone].nxt=st[q].nxt;
			st[clone].link=st[q].link;
			while(p!=-1&&st[p].nxt[c]==q){
				st[p].nxt[c]=clone;
				p=st[p].link;
			}
			st[q].link=st[cur].link=clone;
		}
	}
	last=cur;
}

vector<int>son[2*N];

void dfs(int u){
	for(int i=0;i<son[u].size();i++){
		int v=son[u][i];
		dfs(v);
		endpos[u]+=endpos[v];
	}
}

void get_endpos(){				//不同子序列出现个数
	for(int i=0;i<sz;i++)son[i].clear();
	for(int i=1;i<sz;i++){
		son[st[i].link].push_back(i);
	}
	dfs(0);
	for(int i=0;i<sz;i++)son[i].clear();
}

void solve(){
	sam_init();
    string s;
    cin>>s;
    for(int i=0;i<s.size();i++){
    	ins(s[i]);
    }
    ll res=0;
    get_endpos();
    for(int i=1;i<sz;i++){
    	if(endpos[i]>=2)res=max(res,(ll)endpos[i]*st[i].len);
    }
    cout<<res;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int t=1;
    // cin>>t;
    while(t--){
        solve();
    }
    return 0;
}